#pragma once
#include<iostream>
#include<unordered_map>
#include<functional>
#include<ctime>
#include <sys/types.h>
#include <unistd.h>

// using task_t = std::function<void()>;
// //模拟下载-任务
// void DownLoad()
// {
//     std::cout << "我是下载....,pid:" << getpid() << std::endl;
// }
// //模拟日志-任务
// void Log()
// {
//     std::cout << "我是日志....,pid:" << getpid() << std::endl;
// }
// //模拟数据库同步-任务 
// void sql()
// {
//     std::cout << "我是数据库同步....,pid:" << getpid() << std::endl;
// }
// int num=0;
// class taskmap
// {
// public:
//     taskmap()
//     {
//         srand(time(nullptr));
//         instask(DownLoad);
//         instask(Log);
//         instask(sql);
//     }
//     //插入任务
//     void instask(task_t task)
//     {
//         tasks[num++] = task;
//     }
//     //选择任务
//     int task()
//     {
//         return rand() % num;
//     }
//     //根据num执行任务
//     void exe(int cmd)
//     {
//         if(tasks.find(cmd) == tasks.end()) return ;
//         tasks[cmd]();
//     }

// private:
//     std::unordered_map<int,task_t> tasks;
// };

// taskmap tm;

typedef std::function<void()> wk_t;

void test1()
{
    std::cout << "数据传输" << std::endl; 
}
void test2()
{
    std::cout << "网络传输" << std::endl;
}
void test3()
{
    std::cout << "msq数据库" << std::endl;
}

int numr = 0;
class rw
{
public:
    rw()
    {
        srand(time(nullptr));//随机数终止
        insmap(test1);
        insmap(test2);
        insmap(test3);
    }
    //插入任务
    void insmap(wk_t wk)
    {
        rw_map[numr++] = wk; 
    }

    //随机选择任务
    int text_rand()
    {
        return rand() % numr;
    }
    //执行任务
    void exe(int cmd)
    {
        if(rw_map.find(cmd) == rw_map.end())
        {
            std::cout << "无" << std::endl;
            return;
        }
        rw_map[cmd]();
    }

private:
//哈希表
    std::unordered_map<int,wk_t> rw_map;
};

rw tm;

//读
void test_wrk()
{
    while(true)
    {
        int cmd = 0;
        int n = ::read(0, &cmd, sizeof(cmd));
        if(n == sizeof(cmd))  // 成功读取到一个完整命令
        {
            tm.exe(cmd);
        }
        else if(n == 0)  // 写端关闭
        {
            std::cout << "pid:" << getpid() << "已退出" << std::endl;
            break;
        }
        else if(n < 0)  // 出错
        {
            perror("read");
            exit(1);
        }
        else  // 读取不完整（不太可能发生）
        {
            std::cerr << "Partial read occurred" << std::endl;
            continue;
        }
    }

}
